iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0

Part1:今日目標

1.建立Dataset


Part2:內容

1.建立Dataset

(1)實作概覽

  • 原因:將圖片和對應標籤包成Pytorch的Dataset格式,以方便後續使用DataLoader進行資料批次(batch)訓練。
  • 參考範例: Pytorch官方文件2021鐵人賽優秀文章
  • Debug:
    • 因為裁切圖片時,將圖片名稱都加上"crop_"的前綴字串(prefix),當初是怕污染到原始圖片,但也因此要多建立一個標籤對照表(tag_locCoor_label_crop.csv)和建立CustomImageDataset這個類別(class)時,要對img_name做小調整(感覺被自己整到...

(2)程式碼
Step0: Load module/package

from torch.utils.data import Dataset
from torchvision import datasets
from torchvision.transforms import ToTensor
from torchvision.io import read_image
import numpy as np
import os
import pandas as pd
import torch

prjt_path = r"D:\JPNB\learning_AIdea2022"
train_data_path = str(prjt_path + r"\train_data")
output_path = str(prjt_path + r"\output")

Step1: 為準心圖片建立標籤對照表: tag_locCoor_label_crop.csv

# 將有準心資料的標籤撈出來
df_Y = pd.read_csv(output_path + r"\tag_locCoor_Y.csv")  # 有準心圖片
df_all_label = pd.read_csv(prjt_path + r"\tag_locCoor_label.csv", encoding = "Big5")  # 所有圖片的標籤
df_all_label = df_all_label[['Img', 'label']]

# 串上圖片其他資訊
crop_img_labels = df_Y.merge(df_all_label, on="Img", how="left")
print(crop_img_labels.shape, df_Y.shape)  # (19705, 9) (19705, 8)
# crop_img_labels.groupby("label").size().sort_values(ascending=True)  # 19705張圖片


tmp_cropimg_name_list = []  # 19616張圖片,89張圖片在裁切過程錯誤,所以並非 19705張圖片
path = str(output_path + r"\crop_img")
for img_name in os.listdir(path):
    img_name = img_name.replace("crop_", "")
    tmp_cropimg_name_list.append(img_name)

final_crop_label_df = crop_img_labels[crop_img_labels["Img"].isin(tmp_cropimg_name_list)]
print(final_crop_label_df.shape)  # (19616, 9)
final_crop_label_df.to_csv(prjt_path + r"\tag_locCoor_label_crop.csv")

  • Note: 沒有裁切好的89張圖片,後續要再做調整。

Step2: 客製化類別CustomImageDataset()

class CustomImageDataset(Dataset):
    def __init__(self, annotations_file, img_dir, height, width, transform=None, target_transform=None):
        self.img_labels = pd.read_csv(annotations_file)[["label"]]
        self.img_name =  pd.read_csv(annotations_file)[["Img"]]
        self.img_name = "crop_"+self.img_name
        self.img_dir = img_dir
        self.transform = transform
        self.target_transform = target_transform
        self.height = height  # Debug
        self.width = width

    def __len__(self):
        return len(self.img_labels)

    def __getitem__(self, idx):
        img_path = os.path.join(self.img_dir, self.img_name.iloc[idx, 0])
        image = read_image(img_path)
        resize = transforms.Resize([self.width, self.height])  # Debug: resize img to let all images in same size.
        image = resize(image)
        label = self.img_labels.iloc[idx, 0]  # Debug: 要修改成[idx, 0]才是取數值,不會把欄位名稱一起誤抓        
        #print("label:", label)
        if self.transform:
            image = self.transform(image)
        if self.target_transform:
            label = self.target_transform(label)
        return image, label

Step3: 實例化類別

dataset = CustomImageDataset(annotations_file=str(prjt_path + r"\tag_locCoor_label_crop.csv"),
                             img_dir=str(output_path + r"\crop_img"), height = 190, width=190)

# pick 1000th img data in dataset
first_data = dataset[10000]
features, labels = first_data
print(features, labels)
print(len(dataset))

Part3:專案進度

  • 訓練圖片和標籤都已包裝成Pytorch Dataset格式。

Part4:下一步

  • 使用Dataloader載入資料。
心得小語:
今天差點趕不上發文,在23:30總算Debug完畢開始振筆疾書寫文章,豪開心呀~!!
昨天追劇看太晚,《何以笙簫默》的何以琛實在太有魅力了~ 但今天一整天,真的首次體會到年過25後體力明顯下滑QQ,下班後直接昏睡一個小時補眠。這周末得好好努力啦,當然也是要繼續追劇調劑身心啦!!!
今日工時: 50mins*2

/images/emoticon/emoticon14.gif

相信自己是成功的秘訣
You have to BELIEVE IN YOURSELF. That’s the secret of success.


上一篇
D7-資料集前處理2nd:資料貼標
下一篇
D9-資料集前處理4th:資料集切分&DataLoader
系列文
菜鳥工程師第一個電腦視覺(CV)專案-農作物影像辨識競賽32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言